package com.le.tester.tip;

import java.util.concurrent.TimeUnit;

/**
 * createTime：2022/2/9 14:17
 *
 * description：演示线程在wait的时候，
 * 两个线程需要同时占用锁（那么获得锁就是为了抢占资源），如果一个线程wait了，
 * 另一个线程做去获取锁的动作，看是不是可以获取得到锁
 *
 * result：线程1中获取到了锁，但是wait释放了当前的锁，让线程2--得到了占用锁的机会。该程序中线程2--因为wait获取到了锁
 */
public class WaitLockDemo {

    public static void main(String[] args) {
        Object o = new Object();

        final Thread thread1 = new Thread(() -> {
            System.out.println("线程1开始");

            //同步锁
            synchronized (o) {
                try {
                    //使用wait，看是不是释放锁
                    o.wait();
                    System.out.println("线程1使用了wait");
                } catch (Exception e) {
                    throw new RuntimeException(e.getMessage());
                }
            }
            System.out.println("线程1结束");
        });


        final Thread thread2 = new Thread(() -> {
            System.out.println("线程2开始");

            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }

            synchronized (o) {
                System.out.println("线程2获取到了锁");
            }
            System.out.println("线程2结束");
        });

        thread1.start();
        thread2.start();
    }
}
